package com.cskaoyan.javase.oop1._11static._3usecase;

/**
 * static关键字有什么具体的使用场景呢？
 * 这里，根据static关键字的一些特点来明确它的使用场景，给大家以后使用static关键字做一下参考。
 * 静态成员变量：
 * 属于全体对象所共享而不是独属于某个对象的成员变量
 *      所以当存在需要所有对象共享的变量时，应该使用static修饰的静态成员变量。
 *
 * 在整个类全局独一份的（因为类加载只有一次）
 *      所以，如果希望某个变量在类的全局独一份时，应该使用static修饰的静态成员变量。
 *
 * 静态成员方法：
 * 静态方法的最主要特点就是调用简单，无需创建对象即可调用。
 * 所以如果希望一个方法能够更方便快捷的去调用，可以把它声明为static修饰的静态成员方法。
 *
 * 根据静态成员方法调用简单的特点，当一个类中全部都是静态成员方法时，
 * 类中的所有方法的调用都可以使用类名点去完成，这就是Java当中的"工具类"。
 * 比较典型的有：数组工具类Arrays、集合工具类Collections、数学工具类Math等等。
 *      还有对象工具类(Objects)
 *      除此之外,很多公司当中,都会定义自身公司业务的工具类
 *
 * 最后，还可以使用静态成员方法给静态成员变量赋值。(但是这种方式不多见)
 * 但是一定要注意，静态成员方法不调用不执行，要想依赖静态方法完全赋值，必须主动调用该方法。
 *
 * @since 10:56
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Teacher t = new Teacher();
            System.out.println("第" + (i + 1) + "位老师的id是:" + t.id);
        }
        System.out.println(Teacher.count);
    }
}

class Teacher {
    int id;
    /*
        需求1: 需要统计在外界创建Teacher类对象的次数
        怎么做呢?
        统计次数,首先肯定需要一个计数器
        计数器是一个变量,这个变量应该是什么变量呢?
            首先不可能是局部变量,局部变量不能统计创建对象的次数
            其次也不可能是成员变量,因为成员变量属于对象,每创建一个对象,都是一个新的变量
            所以只能是一个静态成员变量,它属于类
            不受创建对象的影响,可以用来统计创建对象的次数
     */
    static int count = 0;

    /*
        需求2: 假如每个老师都有自己的id
        根据创建对象的先后顺序给这个id赋值
        第一个创建对象的老师id是10001;
        以后每创建一个对象,id都+1
        这怎么做呢?
        这里需要一个变量来存储,随着创建对象次数的增加,而变化的id
        显然这个变量不应该是属于对象的,而是属于类的
        应该是一个静态成员变量
     */

    static int initId = 10001;

    public Teacher() {
        count++;
        /*
            第一次创建对象id是10001
            随后每创建一次对象,id都+1
         */
        id = initId++;
    }
}